package com.mason.forum.controller;

import com.mason.forum.common.APPResult;
import com.mason.forum.common.ResultCode;
import com.mason.forum.model.Message;
import com.mason.forum.model.User;
import com.mason.forum.model.vo.MessageVO;
import com.mason.forum.service.IMessageService;
import com.mason.forum.utils.SessionUtils;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.NonNull;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.List;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 马拉圈
 * Date: 2023-10-08
 * Time: 20:21
 */

@Slf4j
@Api(tags = "站内信相关接口")
@RestController
@RequestMapping("/message")
public class MessageController {


    @Resource
    private IMessageService messageService;

    /**
     * 发送站内信
     * @param request 请求
     * @param receiveUserId 接收者id
     * @param content 站内信内容
     * @return
     */
    @ApiOperation("发送站内信")
    @PostMapping("/send")
    public APPResult sendMessage(HttpServletRequest request,
                                 @RequestParam("receiveUserId") @ApiParam("接收者id") @NonNull Long receiveUserId,
                                 @RequestParam("content") @ApiParam("站内信内容") @NonNull String content) {
        // 用户是否禁言
        User user = SessionUtils.getUser(request);
        if(user.getState() == 1) {
            log.warn(ResultCode.FAILED_USER_BANNED.toString());//已禁言
            return APPResult.failed(ResultCode.FAILED_USER_BANNED);
        }
        // 站内信初步对象
        Message message = new Message();
        message.setPostUserId(user.getId());
        message.setContent(content);
        message.setReceiveUserId(receiveUserId);
        // service 发送站内信
        messageService.sendMessage(message);
        // 成功返回
        return APPResult.success();
    }

    /**
     * 获取未读私信数
     * @param request 请求
     * @return 未读私信数
     */

    @ApiOperation("获取未读私信数")
    @GetMapping("/count")
    public APPResult<Long> getNotAwareNumber(HttpServletRequest request) {
        // 获取当前登录用户
        User user = SessionUtils.getUser(request);
        // service 查询条数
        Long count = messageService.getNotAwareNumber(user.getId());
        // 返回结果
        return APPResult.success(count);
    }

    /**
     * 获取私信列表
     * @param request 请求
     * @return 私信列表
     */

    @ApiOperation("获取私信列表")
    @GetMapping("/list")
    public APPResult<List<MessageVO>> getMessagesById(HttpServletRequest request) {
        // 获取当前登录用户
        User user = SessionUtils.getUser(request);
        // service 查询列表
        List<MessageVO> messageVOS = messageService.getMessagesById(user.getId());
        if(messageVOS == null) {
            messageVOS = new ArrayList<>();
        }
        // 返回结果
        return APPResult.success(messageVOS);
    }

    /**
     * 通过站内信id标记站内信为已读
     * @param request 请求
     * @param id 站内信id
     * @return
     */
    @ApiOperation("通过站内信id标记站内信为已读")
    @PostMapping("/read")
    public APPResult markRead(HttpServletRequest request,
                              @RequestParam("id") @ApiParam("站内信id") @NonNull Long id) {
        // 获取当前登录用户
        User user = SessionUtils.getUser(request);
        // 当前用户是否为站内信的接收者
        Message message = messageService.selectById(id);
        if(message == null || message.getDeleteState() == 1) {
            log.warn(ResultCode.FAILED_MESSAGE_NOT_EXISTS.toString());
            return APPResult.failed(ResultCode.FAILED_MESSAGE_NOT_EXISTS);
        }
        if(!user.getId().equals(message.getReceiveUserId())) {
            // 没有权限
            log.warn(ResultCode.FAILED_UNAUTHORIZED.toString());
            return APPResult.failed(ResultCode.FAILED_UNAUTHORIZED);
        }
        // service层 - 标记修改
        messageService.markRead(id, (byte) 1);
        // 成功返回
        return APPResult.success();
    }

    @ApiOperation("回复站内信")
    @PostMapping("/reply")
    public APPResult replyMessage(HttpServletRequest request,
                                  @RequestParam("repliedId") @ApiParam("被回复的站内信id") @NonNull Long repliedId,
                                  @RequestParam("content") @ApiParam("回复内容") @NonNull String content) {
        // 查询站内信是否存在
        Message repliedMessage = messageService.selectById(repliedId);
        if(repliedMessage == null || repliedMessage.getDeleteState() == 1) {
            log.warn(ResultCode.FAILED_MESSAGE_NOT_EXISTS.toString());
            return APPResult.failed(ResultCode.FAILED_MESSAGE_NOT_EXISTS);
        }
        // 获取当前用户消息
        User user = SessionUtils.getUser(request);
        if(user.getState() == 1) {
            log.warn(ResultCode.FAILED_USER_BANNED.toString());//已禁言
            return APPResult.failed(ResultCode.FAILED_USER_BANNED);
        }
        // 当前用户是否是被回复的站内信的接收者
        if(!user.getId().equals(repliedMessage.getReceiveUserId())) {
            // 没有权限
            log.warn(ResultCode.FAILED_UNAUTHORIZED.toString());
            return APPResult.failed(ResultCode.FAILED_UNAUTHORIZED);
        }
        // 接收者是自己，那么发送者就不是自己，所以我们回复就不用校验是否是回复了自己
        // 因为这是数据库里的正常数据，而不是传参来的，发起者和接收者不可能相同（反正发送的时候也会检查，所以无所谓）
        // 原接收者，也就是当前用户，变为发送者，原发起者变为这接收者者，以此构建初步对象
        Message message = new Message();
        message.setPostUserId(user.getId());
        message.setContent(content);
        message.setReceiveUserId(repliedMessage.getPostUserId());
        // service - 回复站内信
        messageService.replyMessage(message, repliedId);
        // 返回成功
        return APPResult.success();
    }


}
